package io.github.wangtisnruipopo.carscore.types;

import java.util.List;
import java.util.function.Predicate;

/**
 * <h1>一整套牌接口</h1>
 *
 * @author wangtianrui
 */
public interface ISuitCards<D extends AbsDecorValue, V extends AbsCardValue, C extends ISimpleCard<D, V>> {

    /**
     * <h2>返回本场游戏需要几套牌</h2>
     *
     * @return 几套牌数值
     */
    int setsNumber();

    /**
     * <h2>创建一整套牌</h2>
     */
    void create();

    /**
     * <h2>过滤整套牌中不需要的牌</h2>
     *
     * @return 过滤函数
     */
    Predicate<C> filter();

    /**
     * <h2>获取一整套牌</h2>
     *
     * @return 整套牌集合
     */
    List<C> getCards();

    /**
     * <h2>从牌堆顶部抽取一张牌</h2>
     *
     * @return 抽取到的牌
     */
    C drawFromTop();

    /**
     * <h2>从牌堆底部抽取一张牌</h2>
     *
     * @return 抽取到的牌
     */
    C drawFromBottom();

    /**
     * <h2>根据下标抽取牌堆中对应的一张牌</h2>
     *
     * @param index 抽取的下标
     * @return 抽取到的牌
     */
    C drawFromIndex(int index);

    /**
     * <h2>随机从牌堆中抽取卡牌</h2>
     * @return 抽取的卡牌
     */
    C drawRandom();

    /**
     * <h2>洗牌</h2>
     */
    void shuffle();

    /**
     * <h2>获取牌堆中是否还有牌存在</h2>
     *
     * @return 有返回true，无返回false
     */
    boolean hasCards();

    void pushPlayedCard(C card);
    void arrangeCards();
}
